Jak spocitat pocet pracovnich dnu v mesici.
Otázka od: David Michal
17. 10. 2002 12:06
Zdravim,
Nemate nekdo hotovou funkci na %subj. ?
Neco jako: PocetPracovnichDni := CountOFWorkDays('rijen', 2002);
S tim ze tabulku svatku a volnych dni mam nekde v nejake datove tabulce.
Diky,
David
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.401 / Virus Database: 226 - Release Date: 09/10/2002
Odpovedá: Lebeda David
17. 10. 2002 13:54
> Zdravim,
> Nemate nekdo hotovou funkci na %subj. ?
Ahoj,
pouzivam tuhle trojici, pozadavana fce je posledni z nich a pouziva tu
prostredni a ta
zas pouziva tu prvni.
function TDM.Velikonoce(Rok: Word): TDateTime;
var
Ve_A, Ve_B, Ve_C, Ve_K, Ve_P, Ve_Q,Ve_F, Ve_G,Ve_D, Ve_E : LongInt;
d, m: word;
begin
Ve_A:=Rok mod 19;
Ve_B:=Rok mod 4;
Ve_C:=Rok mod 7;
Ve_K:=Trunc(Rok/100);
Ve_P:=Trunc(((8 * Ve_K) + 13)/25);
Ve_Q:=Trunc(Ve_K/4);
Ve_F:=(15 - Ve_P + Ve_K - Ve_Q) mod 30;
Ve_G:=(4 + Ve_K - Ve_Q) mod 7;
Ve_D:=((19 * Ve_A) + Ve_F) mod 30;
Ve_E:=((2 * Ve_B) + (4 * Ve_C) + (6 * Ve_D) + Ve_G) mod 7;
if (Ve_D + Ve_E) <= 9 then
begin
d := 22 + Ve_D + Ve_E;
m := 3;
end
else
begin
d := Ve_D + Ve_E - 9;
m := 4;
end;
if (Ve_D = 29) and (Ve_E = 6) then
d := 19;
if (Ve_D = 28) and (Ve_E = 6) and (Ve_A > 10) then
d := 18;
result := EncodeDate(Rok, m, d) + 1;
end;
function TDM.JePracovni(dt: TDateTime): Boolean;
var
vRok, vMesic, vDen: word;
Rok, Mesic, Den: word;
begin
DecodeDate(dt, Rok, Mesic, Den);
DecodeDate(Velikonoce(rok), vRok, vMesic, vDen);
result := not ((DayOfWeek(dt) in [1, 7]) or
((den = 1) and (mesic in [1, 5])) or
((mesic = 7) and (den in [5, 6])) or
((den = 8) and (mesic = 5)) or
((den = 28) and (mesic in [9, 10])) or
((den = 17) and (mesic = 11)) or
((den = vDen) and (mesic = vMesic)) or
((mesic = 12) and (den in [24, 25, 26])));
end;
function PocetPracDnu(mesic, rok: word): integer;
var
dt, konec: TDateTime;
begin
result := 0;
if mesic = 12 then
konec := Int(EncodeDate(rok + 1, 1, 1))
else
konec := Int(EncodeDate(rok, mesic + 1, 1));
dt := EncodeDate(rok, mesic, 1);
while dt < konec do
begin
if JePracovni(dt) then
inc(result);
dt := dt + 1;
end;
end;
David Lebeda
Odpovedá: Petr Jansky
18. 10. 2002 5:37
Ja neco podobneho delam takto:
V cyklu testuju kazdy den, jestli to neni SO ani NE a jestli neexistuje v
tabulce svatku.
Asi takhle nejak:
function CountOFWorkDays(Mes,Rok : word): word;
var
I, J : word
begin
Result := 0;
for I := 1 to DaysInAMonth(Rok,Mes) do
begin
J := DayOfWeek(EncodeDate(Rok,Mes,I));
if ((J > 1) and (J < 7)) and
"datum: Rok,Mes,I neexisuje v
tabulce svatek " then
inc(Result);
end;
> Zdravim,
> Nemate nekdo hotovou funkci na %subj. ?
> Neco jako: PocetPracovnichDni := CountOFWorkDays('rijen', 2002);
> S tim ze tabulku svatku a volnych dni mam nekde v nejake datove tabulce.
> Diky,
> David
---
Odchozí zpráva mozná neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.401 / Virová báze: 226 - datum vydání: 9.10.2002